package com.abbas.smartCity.base

import android.R
import android.os.Bundle
import android.view.LayoutInflater
import android.view.MenuItem
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.viewbinding.ViewBinding
import com.abbas.smartCity.util.ActivityManager
import com.abbas.smartCity.util.NetScope
import com.abbas.smartCity.util.NoImpl
import com.google.gson.Gson
import java.lang.reflect.ParameterizedType

/**
 * 使用 ViewBinding 的抽象活动基类
 * 子类须持有一个ViewBinding的引用
 * 子类填入泛型后就可以直接使用 binding 对象进行控件操作
 *
 * ViewBinding 需要在gradle当中启用，类似DataBinding
 * 似乎需要导包
 * 不确定竞赛是否可以使用
 *
 * 已确定 不可使用
 */
@NoImpl
abstract class BaseBindingActivity<VB : ViewBinding> : AppCompatActivity(), NetScope {

    protected lateinit var binding: VB
    protected val gson = Gson()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        ActivityManager.getInstance().push(this)

        var genericSuperclass = javaClass.genericSuperclass as ParameterizedType
        var actualTypeArguments = genericSuperclass.actualTypeArguments[0] as Class<*>
        var declaredMethod =
            actualTypeArguments.getDeclaredMethod("inflate", LayoutInflater::class.java)
        binding = declaredMethod.invoke(null, layoutInflater) as VB
        setContentView(binding.root)

        initData()
        initEvent()
    }

    /**
     * 子类重写此方法已决定是否启用页面左上角返回
     * @return 默认true
     */
    protected open fun enableUp(): Boolean {
        return true
    }

    /**
     * 设置标题栏标题
     * @return 标题
     */
    protected abstract fun setCustomTitle(): String?

    /**
     * 数据操作、网络操作
     */
    protected abstract fun initData()

    /**
     * 监听设置、事件设置
     */
    protected abstract fun initEvent()

    /**
     * 右上角点击返回结束页面
     * @param item 菜单
     * @return ???
     */
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        if (item.itemId == R.id.home) {
            finish()
        }
        return super.onOptionsItemSelected(item)
    }

    /**
     * 短暂的显示一个提示
     *
     * @param tip 提示信息
     */
    protected open fun showToast(tip: String?) {
        Toast.makeText(this, tip, Toast.LENGTH_SHORT).show()
    }


    override fun onDestroy() {
        super.onDestroy()
        ActivityManager.getInstance().remove(this)
    }
}